<?php

//基底クラスのメンバ変数に
//$this->_breadcrumb = new Apm_Breadcrumb();
//$this->setPankuzu($this->pankuzu->generatePankuzu());

//$this->_pankuzu->add('url' => aaaa , 'title'=> 'xxx');

class Apm_Breadcrumb
{
    /**
     * パンくずデータ格納
     * 
     * @var array
     */
    private $_data = array();

	/**
	 * パンくずの最後に追加するデータ（セッション登録は行わない）
	 *
	 * @var string :最後のパンくずの末尾に追加する文字列
	 * @var array  :最後に追加するパンくず配列（=現在地となる）
	 */
	private $_tailStr = "";
	private $_tailArr = array();

    /**
     * コンストラクタ<br>
     * セッションに保持されているパンくずデータを代入
     * 
     * @return void
     */
    public function __construct()
    {
        $this->_data = &$_SESSION['pankuzu'];
    }
    
    /**
     * パンくずを生成
     * 
     * @return string
     */
    public function generateBreadcrumb($max = NULL)
    {
        $tmp = array();
        $count = $this->getCountPankuzu();
        $end_index = $count - 1;
        if(isset($max) && $count > $max){
            $count = $max;
        }
		if (!empty($this->_tailArr)) $count++;
        for($i = 0; $i < $count-1; $i++){
			if ($this->_data[$i]['url'] == '_blank') {
                $tmp[] = '<li><a>'.$this->_data[$i]['title'].'</a></li>';
			} else {
                $tmp[] = sprintf('<a href="%s">%s</a>', $this->_data[$i]['url'], $this->_data[$i]['title']);
			}
        }
		if (!empty($this->_tailArr)) {
			$tmp[] = '<li><strong>'.$this->_tailArr['title'].'</strong></li>';
		} else {
			$tmp[] = '<li><strong>'.$this->_data[$end_index]['title'].$this->_tailStr.'</strong></li>';
		}
        return implode('', $tmp);
    }
    
    /**
     * パンくずデータを初期化
     * 
     * @return void
     */
    public function reset()
    {
        $this->_data = array();
		$this->_tailStr = "";
		$this->_tailArr = array();
    }
    
    /**
     * パンくずデータをカウント数を返す
     * 
     * @return void
     */
    public function getCountPankuzu()
    {
        return count($this->_data);
    }
    
    /**
     * データを追加
     * 
     * @return void
     */
    public function add($title, $url = '', $key = '')
    {
        $map = array();
        $map['title']   = $title;
        $map['url']     = !empty($url) ? $url : $_SERVER['REQUEST_URI'];
        $map['url']     = ereg_replace("asn/1/contents/", "", $map['url']);
        $map['key']     = !empty($key) ? $key : urlencode($map['url']);

        $tmp = array();
        if(count($this->_data) > 0){
            while ($h = array_shift($this->_data)){
                if ($h['key'] == $map['key']){
                    break;
                }
                $tmp[] = $h;
            }
        }
        $this->_data    = array();
        $this->_data    = $tmp;
        $this->_data[]  = $map;
    }

    /**
     * インデックスからデータを削除
     * 
     * @param int $param 削除するデータのインデックス
     * @return void
     */
    public function deleteByIndex($param)
    {
        $i = '0';
        $tmp = array();
        if(empty($this->_data)){
            return;
        }
        foreach ($this->_data as $buf){
            if($i == $param){
                $i++;
                continue;
            }
            $tmp[] = array('url' => $buf['url'], 'title' => $buf['title'], 'key' => $buf['key']);
            $i++;
        }
        $this->_data = array();
        $this->_data = $tmp;
    }
    
    /**
     * キーからデータを削除
     * 
     * @param string $param 削除するデータのキー
     * @return void
     */
    public function deleteByKey($param)
    {
        $tmp = array();
        if(empty($this->_data)){
            return;
        }
        foreach ($this->_data as $buf){
            if($buf['key'] == $param){
                continue;
            }
            $tmp[] = array('url' => $buf['url'], 'title' => $buf['title'], 'key' => $buf['key']);
        }
        $this->_data = array();
        $this->_data = $tmp;
    }
    
    /**
     * インデックスからデータを取得
     * 
     * @param int $param 取得するデータのインデックス
     * @return array パンくずデータ
     */
    public function getDataByIndex($param)
    {
        $i = '0';
        $tmp = array();
        if(empty($this->_data)){
            return $tmp;
        }
        foreach ($this->_data as $buf){
            if($i == $param){
                $tmp = array('url' => $buf['url'], 'title' => $buf['title'], 'key' => $buf['key']);
                return $tmp;
            }
            $i++;
        }
    }
    
    /**
     * キーからデータを取得
     * 
     * @param string $param 取得するデータのキー
     * @return array パンくずデータ
     */
    public function getDataByKey($param)
    {
        $tmp = array();
        if(empty($this->_data)){
            return $tmp;
        }
        foreach ($this->_data as $buf){
            if($buf['key'] == $param){
                $tmp[] = array('url' => $buf['url'], 'title' => $buf['title'], 'key' => $buf['key']);
                return $tmp;
            }
        }
        
    }
    
    /**
     * インデックスからデータをセット
     * 
     * @param int $param セットするデータのインデックス
     * @param array $data データ
     * @return void
     */
    public function setDataByIndex($param, $data)
    {
        $i = '0';
        if(empty($this->_data)){
            return;
        }
        foreach ($this->_data as $buf){
            if($i == $param){
                $this->_data[$i] = $data;
                $i++;
                return;
            }
            $i++;
        }
    }
    
    /**
     * キーからデータをセット
     * 
     * @param string $key セットするデータのキー
     * @param array $data データ
     * @return void
     */
    public function setDataByKey($param, $data)
    {
        $tmp = array();
        if(empty($this->_data)){
            return;
        }
        foreach ($this->_data as $buf){
            if($buf['key'] == $param){
                $tmp[] = $data;
                continue;
            }
            $tmp[] = array('url' => $buf['url'], 'title' => $buf['title'], 'key' => $buf['key']);
        }
        $this->_data = array();
        $this->_data = $tmp;
    }

	/**
	 * tail文字列にデータを追加
	 * 
	 * @return void
	 */
	public function addTailStr($tail)
	{
		$this->_tailStr = $tail;
	}
	/**
	 * tail配列にデータを追加
	 * 
	 * @return void
	 */
	public function addTailArr($title, $url = '', $key = '')
	{
		$map = array();
		$map['title']   = $title;
		$map['url']     = !empty($url) ? $url : $_SERVER['REQUEST_URI'];
		$map['url']     = ereg_replace("asn/1/contents/", "", $map['url']);
		$map['key']     = !empty($key) ? $key : urlencode($map['url']);
		
		$this->_tailArr = $map;
	}
	/**
	 * tail文字列からデータを取得
	 * 
	 * @return string
	 */
	public function getTailStr()
	{
		return $this->_tailStr;
	}
	/**
	 * tail配列からデータを取得
	 * 
	 * @return array
	 */
	public function getTailArr()
	{
		return $this->_tailArr;
	}

}
?>
